package io.mft.as.ar.gateway.client;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import io.mft.as.ar.gateway.config.BusConfig;
import io.mft.as.ar.gateway.config.BusIdConfig;
import io.mft.as.ar.gateway.constants.GatewayConstants;
import io.mft.as.ar.gateway.exception.GatewayClientException;
import lombok.extern.slf4j.Slf4j;

/**
 * 描述: 网关服务管理类
 * 版权: Copyright (c) 2013 
 * 公司: 思迪科技 
 * 作者: 李建 
 * 版本: 1.0 
 * 创建日期: 2013-1-21 
 * 创建时间: 下午4:33:31
 */
@Slf4j
public class GateWayManager
{
    
    
    /**
     * 用于存放不同网关信息
     */
    private static Map<String, Server> SERVER_INFO_MAP = new HashMap<String, Server>();
    
    static
    {
        init();
    }
    
    private GateWayManager()
    {
        
    }
    
    public synchronized static void init()
    {
        Map<String, ConcurrentHashMap<String, String>> config = BusConfig.getServerConfig();
        
        Map<String, Server> serverInfoMap = null;
        if ( config != null )
        {
            serverInfoMap = new HashMap<String, Server>();
            
            Iterator<Map.Entry<String, ConcurrentHashMap<String, String>>> iter = config.entrySet().iterator();
            while (iter.hasNext())
            {
                Map.Entry<String, ConcurrentHashMap<String, String>> entry = (Map.Entry<String, ConcurrentHashMap<String, String>>) iter
                        .next();
                String key = entry.getKey();
                if (SERVER_INFO_MAP.containsKey(key)) {
					continue;
				}
                ConcurrentHashMap<String, String> configMap = entry.getValue();
                Server server = new Server(key, configMap);
                
                serverInfoMap.put(key, server);
            }
        }
        
        if ( serverInfoMap != null )
        {
            SERVER_INFO_MAP.putAll(serverInfoMap);
            serverInfoMap.clear();
        }
        
    }
    
    /**
     *
     * @描述: 重新更新 服务器信息(仅更新服务器IP地址信息，不能更新其它配置属性，特别是长短连接，否则会有问题)
     * @作者: liwei
     * @创建日期: 2016年2月3日 下午4:55:26
     */
    public synchronized static void modifiedServerInfo()
    {
        Map<String, ConcurrentHashMap<String, String>> config = BusConfig.getServerConfig();
        
        Map<String, Server> serverInfoMap = null;
        if ( config != null )
        {
            serverInfoMap = new ConcurrentHashMap<String, Server>();
            
            Iterator<Entry<String, ConcurrentHashMap<String, String>>>iter = config.entrySet().iterator();
            while (iter.hasNext())
            {
                Map.Entry<String, ConcurrentHashMap<String, String>> entry = (Map.Entry<String, ConcurrentHashMap<String, String>>) iter.next();
                String key = entry.getKey();
                ConcurrentHashMap<String, String> configMap = entry.getValue();
                
                //更新服务器IP地址信息
                Server server = (Server) SERVER_INFO_MAP.get(key);
                if ( server != null )
                {
                    String serverList = MapUtil.getStr(configMap, "gateway");
                    
                    server.setNetAddressArr(server.getScanServerType(), serverList, server.getHttpScanAddr(),
                            server.getHttpRequestAddr());
                    
                    SERVER_INFO_MAP.put(key, server);
                }
            }
        }
        
        if ( serverInfoMap != null )
        {
            SERVER_INFO_MAP.putAll(serverInfoMap);
            serverInfoMap.clear();
        }
        
    }
    
    /**
     *
     * 描述：返回所有的服务信息
     * 作者：李炜
     * 时间：Apr 27, 2014 3:34:35 PM
     * @return
     */
    public static Map<String, Server> getServers()
    {
        return SERVER_INFO_MAP;
    }
    
    /**
     *
     * @描述: 获取默认的服务器信息
     * @作者: liwei
     * @创建日期: 2016年11月17日 下午10:27:55
     * @return
     */
    public static Server getServer()
    {
        String serverName = BusIdConfig.getDefaultSystemId();
        return getServer(serverName);
    }
    
    /**
     *
     * 描述：获取指定名称的服务器信息
     * 作者：李炜
     * 时间：Dec 9, 2013 8:54:48 PM
     * @param key
     * @return
     */
    public static Server getServer(String serverName)
    {
        String busConfigId = BusIdConfig.getBusConfigId(serverName);
        return getServerByBusConfigId(busConfigId);
    }
    
    /**
     * 
     * @描述:  
     * @作者: liwei
     * @创建日期: 2017年11月26日 下午5:44:34
     * @param busConfigId
     * @return
     */
    public static Server getServerByBusConfigId(String busConfigId)
    {
        if ( ObjectUtil.isNotEmpty(busConfigId) && SERVER_INFO_MAP.containsKey(busConfigId) )
        {
            return SERVER_INFO_MAP.get(busConfigId);
        }
        else
        {
            throw new GatewayClientException( -1, "服务器信息[" + busConfigId + "]在BusConfig.xml配置文件中不存在");
        }
    }
    
    /**
     *
     * @描述: 随机获取服务器地址
     * @作者: liwei
     * @创建日期: 2016年11月17日 下午10:35:22
     * @return
     */
    public static NetAddress getRmdAddr()
    {
        String serverName = BusConfig.getDefaultServerId();
        return getRmdAddr(serverName);
    }
    
    /**
     *
     * @描述: 随机获取服务器地址
     * @作者: liwei
     * @创建日期: 2016年11月17日 下午10:34:53
     * @param serverName
     * @return
     */
    public static NetAddress getRmdAddr(String serverName)
    {
        Server server = getServer(serverName);
        if ( server != null )
        {
            
            try
            {
                return server.getRmdServer();
            }
            catch (Exception ex)
            {
                log.error("", ex);
            }
        }
        return null;
    }
    
    /**
     *
     * 描述：
     * 作者：李炜
     * 时间：Dec 15, 2013 5:32:52 AM
     * @param key
     * @return
     */
    public static String getVersion(String serverName)
    {
        String version;
        Server server = getServer(serverName);
        if ( server == null )
        {
            version = BusConfig.getString(serverName, GatewayConstants.BUS_CONFIG_FIELD_VERSION);
        }
        else
        {
            version = server.getVersion();
        }
        
        return ObjectUtil.isEmpty(version) ? "2" : version;
        
    }
    
    /**
     *
     * 描述：
     * 作者：李炜
     * 时间：Dec 15, 2013 5:54:57 AM
     * @param key
     * @return
     */
    public static int getMode(String serverName)
    {
        int mode;
        Server server = getServer(serverName);
        if ( server == null )
        {
            mode = BusConfig.getInt(serverName, GatewayConstants.BUS_CONFIG_FIELD_MODE);
        }
        else
        {
            mode = server.getMode();
        }
        
        return mode;
    }
    
}
